package javase2.day06.demo10;
/*
进入TimeWaitIng的两种方式：
    1.使用sleep(long m)方法，在毫秒值结束后，线程进入Runabled/Blocked状态
    2.使用wait(long m)方法在毫秒值结束后如果还没有被notify唤醒，就会自动醒来进入Runabled/Blocked状态

唤醒的方法：
    1.notify()
    2.nptifyAll()

 */
public class Demo02WaitAndNotify {
    public static void main(String[] args) {
        //锁对象必须唯一
        Object obj=new Object();

        //顾客1线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //同步代码块
                    synchronized (obj){
                        System.out.println("顾客一：老板来两个韭菜包子");
                        //调用wait方法，放弃CPU执行权，进入WAITING状态（无限等待）
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //唤醒后代码
                        System.out.println("老板，顾客一：给你两元钱");
                        System.out.println("---------------------");
                    }
                }
            }
        }.start();

        //顾客2线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //同步代码块
                    synchronized (obj){
                        System.out.println("顾客二：老板来两个韭菜包子");
                        //调用wait方法，放弃CPU执行权，进入WAITING状态（无限等待）
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //唤醒后代码
                        System.out.println("老板，顾客二：给你两元钱");
                        System.out.println("---------------------");
                    }
                }
            }
        }.start();

        //老板线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //花费2秒做包子sleep
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //同步代码块
                    synchronized (obj){
                        System.out.println("老板花费5秒做好了包子，交给顾客吃");
                        //调用notify方法，唤醒顾客吃包子
//                        obj.notify();//如果有多个线程等待就随机唤醒
                        obj.notifyAll();
                    }
                }
            }
        }.start();
/*
顾客一：老板来两个韭菜包子
顾客二：老板来两个韭菜包子
老板花费5秒做好了包子，交给顾客吃
老板，顾客二：给你两元钱
---------------------
顾客二：老板来两个韭菜包子
老板，顾客一：给你两元钱
---------------------
顾客一：老板来两个韭菜包子
老板花费5秒做好了包子，交给顾客吃
老板，顾客一：给你两元钱
---------------------
顾客一：老板来两个韭菜包子
老板，顾客二：给你两元钱
---------------------......
 */
    }
}
